package repository

import (
	"context"
	"github.com/example/video_backend/internal/model"
	"gorm.io/gorm"
)

// ImageRepository 图片仓库接口
type ImageRepository interface {
	// Create 创建图片记录
	Create(ctx context.Context, image *model.Image) error
	// GetByID 根据ID获取图片
	GetByID(ctx context.Context, id uint) (*model.Image, error)
	// Update 更新图片信息
	Update(ctx context.Context, image *model.Image) error
	// Delete 删除图片
	Delete(ctx context.Context, id uint) error
	// List 获取图片列表
	List(ctx context.Context, page, pageSize int, userID *uint) ([]*model.Image, int64, error)
	// IncrementViews 增加图片浏览量
	IncrementViews(ctx context.Context, id uint) error
	// IncrementLikesCount 增加图片点赞数
	IncrementLikesCount(ctx context.Context, id uint) error
}

// imageRepository 图片仓库实现
type imageRepository struct{}

// NewImageRepository 创建图片仓库实例
func NewImageRepository() ImageRepository {
	return &imageRepository{}
}

// Create 创建图片记录
func (r *imageRepository) Create(ctx context.Context, image *model.Image) error {
	return model.DB.WithContext(ctx).Create(image).Error
}

// GetByID 根据ID获取图片
func (r *imageRepository) GetByID(ctx context.Context, id uint) (*model.Image, error) {
	var image model.Image
	err := model.DB.WithContext(ctx).First(&image, id).Error
	return &image, err
}

// Update 更新图片信息
func (r *imageRepository) Update(ctx context.Context, image *model.Image) error {
	return model.DB.WithContext(ctx).Save(image).Error
}

// Delete 删除图片
func (r *imageRepository) Delete(ctx context.Context, id uint) error {
	return model.DB.WithContext(ctx).Delete(&model.Image{}, id).Error
}

// List 获取图片列表
func (r *imageRepository) List(ctx context.Context, page, pageSize int, userID *uint) ([]*model.Image, int64, error) {
	var images []*model.Image
	var total int64

	query := model.DB.WithContext(ctx).Model(&model.Image{}).Where("is_public = ?", true)

	// 如果指定了用户ID，只获取该用户的图片
	if userID != nil {
		query = query.Where("user_id = ?", *userID)
	}

	// 获取总数
	if err := query.Count(&total).Error; err != nil {
		return nil, 0, err
	}

	// 分页获取图片列表
	if err := query.Order("created_at DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&images).Error; err != nil {
		return nil, 0, err
	}

	return images, total, nil
}

// IncrementViews 增加图片浏览量
func (r *imageRepository) IncrementViews(ctx context.Context, id uint) error {
	return model.DB.WithContext(ctx).Model(&model.Image{}).Where("id = ?", id).Update("views", gorm.Expr("views + ?", 1)).Error
}

// IncrementLikesCount 增加图片点赞数
func (r *imageRepository) IncrementLikesCount(ctx context.Context, id uint) error {
	return model.DB.WithContext(ctx).Model(&model.Image{}).Where("id = ?", id).Update("likes_count", gorm.Expr("likes_count + ?", 1)).Error
}
